<?php

/** 
 * @author juanjo
 * 
 */

  if ( !defined( "RUTA_FISICA_SISTEMA" ) )
    {
       require_once "../../../config/Constantes.php";
    }
     
  $ruta_sistema = RUTA_FISICA_SISTEMA . "/sistema/"; 
    
  require_once  $ruta_sistema . "general/clases/comun/base_datos/DataBase.php"; 
     
class ConfiguracionGeneral
   {
      //TODO - Insert your code here
      private static $_informacion;

      /**
       * 
       */
      function __construct()
         {

            //TODO - Insert your code here
         }
         
         /**
          * 
          * Nombre         : 	get
          * Descripción   	:	Devuelve el valor asignado a la propiedad que se desea buscar
          * Version 			:  1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	17/05/2012, 16:42:16
          * params: @param $propiedad
          * params: @param $forzar_recarga
          * return: return_type
          */
       public static function get( $propiedad, $forzar_recarga = false, $asignar_valor = true )
         {
            $valor = self :: getValorPropiedad( $propiedad, $forzar_recarga, $asignar_valor );
              
            //echo " Valor Normal: $valor <br />";
            
            while ( self :: verificarExistePropiedadValor( $valor ) )
              {
                 $valor = self :: setValorInformacion( $propiedad, $valor, $asignar_valor );  
              }

            //echo " Valor Cambiado: $valor <br />";
            return utf8_encode( $valor );  
         } 

         /**
          * 
          * Nombre         	: 	verificarExistePropiedadValor
          * Descripcion   	:	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	19/05/2012, 16:22:45
          * @param unknown_type $valor
          * @param unknown_type $forzar_recarga
          * @param unknown_type $asignar_valor
          * @return Ambigous <string, multitype:, mixed>
          */
       private static function verificarExistePropiedadValor( $valor )
         {
            if ( stripos( $valor , '${' ) !== false )
              {
                 return true;
              }
            else
              {
                 return false;
              }  
         }   


       private static function getValorPropiedad( $propiedad, $forzar_recarga, $asignar_valor )
         {            
            $valor = self :: getValorBaseDatos( $propiedad, $forzar_recarga, $asignar_valor);
            
            // Verificamos si no se obtuvo un valor desde la base de datos
            if ( $valor && $valor == "Propiedad Inexistente" )
              {
                 // Intentamos obtener el valor desde alguna constante declarada
                 $valor = self ::getValorConstante( $propiedad, $asignar_valor );
                 
                 // Verificamos si no se obtuvo un valor desde la constante
                  if ( $valor && $valor == "Propiedad Inexistente" )
                    {
                       // Intentamos devolver el valor desde el arreglo
                       $valor = self :: getValorInformacion( $propiedad );
                    }
              }

            return $valor;  
         }  
         
         /**
          * 
          * Nombre         : 	getValorBaseDatos
          * Descripción   	:	Obtiene el valor desde la base de datos registrado en la tabla de configuracion
          * Version 			:  1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	17/05/2012, 16:33:08
          * params: @param  $propiedad
          * params: @param  $forzar_recarga
          * params: @return string
          * return: string
          */
       private static function getValorBaseDatos( $propiedad, $forzar_recarga, $asignar_valor = true )
         {
            self :: init();
            
            // Si no se requiere forzar la recarga, entonces se va a devolver el valor ya obtenido previamente
            if ( !$forzar_recarga )
              {
                  // verificamos si ya existe el valor de la clave
                  if ( key_exists( $propiedad, self :: $_informacion ) )
                    {
                       //echo "Obteniendo desde el arreglo <br />";
                       return self :: getValorInformacion( $propiedad );
                    }
              }
              
            // echo "Obteniendo desde la base de datos <br />"; 
              
             // Obtenemos el valor de la base de datos
             $query = "Select valor 
                      From configuracion 
                      Where propiedad = '$propiedad'
                      And activo = 1 ";

             $resultados = DataBase::query( $query );
             
             if ( DataBase::getNumeroRegistros( $resultados ) > 0 )
               {
                  $informacion = DataBase::getArrayResult( $resultados );
                  
                  if ( $informacion )
                    {
                       //if ( $asignar_valor )
                       //self :: setValorInformacion( $propiedad, $informacion[ "valor" ], $asignar_valor );
                       
                       return $informacion[ "valor" ];
                    }
               }

             return "Propiedad Inexistente";                            
         } 
         
         /**
          * 
          * Nombre         : 	getValorConstante
          * Descripción   	:	Devuelve el valor de una constante que coincida con la propiedad proporcionada
          * Version 			:  1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	17/05/2012, 16:54:00
          * params: @param $propiedad
          * params: @return string
          * return: string
          */
       private static function getValorConstante( $propiedad, $asignar_valor = true )
         {
           // echo "Intentando obtener desde una constante <br />";
            // Verificamos si existe la contante
           $valor = "Propiedad Inexistente"; 
            
           try
             {
                $valor = @constant( $propiedad );
             }
           catch ( Exception $ex )
             {}  
           
           if ( !$valor )
             {
                /*if ( $asignar_valor )
                  {
                     self :: setValorInformacion( $propiedad, $valor, $asignar_valor );
                  }
             }
           else*
             {*/
                $valor = "Propiedad Inexistente"; 
             }  
             
            return $valor;
         }  

         /**
          * 
          * Nombre         : 	getValorInformacion
          * Descripción   	:  Devuelve el valor que se encuentra en el arreglo, en caso de que exista	
          * Version 			:  1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	17/05/2012, 16:39:19
          * params: @param  $propiedad
          * params: @return string
          * return: string
          */
      private static function getValorInformacion( $propiedad )
        {
           self :: init();
           
           if ( key_exists( $propiedad, self :: $_informacion ) )
             {
                return self :: $_informacion[ $propiedad ];
             }
             
           return "Propiedad inexistente";  
        }  
         
        /**
         * 
         * Nombre         	: 	setValorInformacion
         * Descripción   	:	Agrega la informacion en el arreglo con la clave y valor proporcionado
         * Version 			:  1.0
         * Autor:			   :	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	17/05/2012, 16:39:54
         * params: @param  $propiedad
         * params: @param  $valor
         * return: string
         */
       private static function setValorInformacion( $propiedad, $valor, $asignar_valor = true )
         {
            self :: init();
              
            /*if ( key_exists( $propiedad , self :: $_informacion ) )
              {
                 
              }  */
            
           // echo "propiedad: $propiedad <br/>";
            //echo "valor: $valor <br />";
            //echo "asignar valor: $asignar_valor<br />";
            
            preg_match_all( '/\$\{[a-zA-Z_-\w.]*\}*/' , $valor, $coincidencias );
            
            if ( $coincidencias )
              {
                 if ( is_array( $coincidencias ) && count( $coincidencias ) > 0 )
                   {
                      
                      foreach( $coincidencias[ 0 ] as $tmp_propiedad )
                        {
                           $str_propiedad = str_ireplace( '}', '',  str_ireplace( '${', '', $tmp_propiedad ) );
                           
                           $tmp_valor = self :: getValorPropiedad( $str_propiedad, false, true );
                           
                           $valor = str_ireplace( $tmp_propiedad, $tmp_valor, $valor );
                           
                           //echo $valor . "<br />";
                           //var_dump( $tmp_propiedad );
                        }
                      //var_dump( $coincidencias );
                   }
              }
              
            //  echo "{". $valor . "}";
            
            if ( $asignar_valor )
              {
                 self :: $_informacion[ $propiedad ] = $valor;  

                 return $valor;
              }
         }  
         
      private static function remplazarPropiedades()
        {
           
        }
         
         /**
          * 
          * Nombre         : 	init
          * Descripción   	:  Inicializa el arreglo en caso de que no este previamente inicializado	
          * Version 			:  1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	17/05/2012, 16:40:28
          * params: 
          * return: return_type
          */
       private static function init()
         {
            if ( !self :: $_informacion )
              {
                 self :: $_informacion = array();
              }
         }  
   }
   
   /*echo ConfiguracionGeneral::get("IDIOMAS_RUTA_BASE");
   echo "<br />";
   echo ConfiguracionGeneral::get("TITULO_SISTEMA");*/